package com.desmao.mapper;


import com.github.pagehelper.PageInfo;
import com.desmao.db.DBSource;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface BaseMapper<T, ID extends Serializable> {

	/**
	 * 插入对象
	 * @param entity
	 * @return
     */
	@DBSource("master")
	int insert(T entity);

	/**
	 * 选择性插入
	 * <p>
	 *     该方法可以插入表中所有字段,但列配置了<ignoreColumn>属性将不会插入.然而,参数对象为空的列将不会插入值
	 * </p>
	 * @param entity
	 * @return 插入方法将返回插入受影响的行数(通常是0或者1). I配置了<generatedKey>属性,自动增长值会被设置在参数对象中返回.
     */
	@DBSource("master")
	int insertSelective(T entity);

	/**
	 * 根据主键查询
	 * @param id
	 * @return
     */
	@DBSource("slave")
	T selectByPrimaryKey(ID id);

	/**
	 * 选择性更新
	 * @param entity
	 * @return
     */
	@DBSource("master")
	int updateByPrimaryKeySelective(T entity);

	/**
	 * 根据主键更新所有字段
	 * @param entity
	 * @return
     */
	@DBSource("master")
	int updateByPrimaryKey(T entity);
	/**
	 * 根据主键删除
	 * @param id
	 * @return
     */
	@DBSource("master")
	int deleteByPrimaryKey(ID id);

	@DBSource("slave")
	List<T> selectList();

	/**
	 * 根据条件集合进行指定类型对象集合查询
	 *
	 * @param condition
	 *            进行查询的条件集合
	 * @return 返回泛型参数类型的对象集合，如何取到泛型类型参数，请参看{@link #getEntityClass()}
	 */
	@DBSource("slave")
	List<T> selectList(Map<String, Object> condition);

	/**
	 * 根据条件集合进行指定类型对象集合查询
	 *
	 * @param condition
	 *            进行查询的条件集合
	 * @return 返回泛型参数类型的对象集合，如何取到泛型类型参数，请参看{@link #getEntityClass()}
	 */
	@DBSource("slave")
	List<T> selectList(Map<String, Object> condition, String orderBy);

	@DBSource("slave")
	PageInfo<T> selectPage(int page, int rows);

	/**
	 * <p/>
	 * 根据给定的页码进行分页查找
	 * <p/>
	 * @param condition
	 *                  查询过滤条件,以key-value形式組成
	 * @param page
	 *                  查询当前页数
	 * @param rows
	 *                  返回的數量
	 * @param orderBy   排序
	 *
	 * @return PageInfo
	 *
	 */
	@DBSource("slave")
	PageInfo<T> selectPage(Map<String, Object> condition, int page, int rows, String orderBy);


	/**
	 * 取得泛型类型
	 *
	 * @return
	 */
	Class<T> getEntityClass();

}
